﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Services;

namespace WebApplication1
{
    /// <summary>
    /// WebService1 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务，请取消注释以下行。 
    // [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public string HelloWorld2()
        {
            Thread.Sleep(5000);
            return "Hello World222";
        }

        //输出缓存的使用非常简单，比较适用于WebService的参数比较少，结果比较单一的情况
        //BufferResponse是否缓存该请求的响应
        //缓存持续时间(秒)
        //要注意的是，不是所有服务都适合使用这种缓存，例如每次结果都不一样的，
        //访问数极高的服务，缓存将会变得非常大，占用很多服务器的内存，却没有实际效果。
        [WebMethod(Description="返回缓存了的服务器时间",BufferResponse=true,CacheDuration=10)]
        //[WebMethod]
        public string CacheTest1()
        {
            //还不知道怎么才能展现效果……15.7.14
            Thread.Sleep(3000);
            return DateTime.Now.ToString();
        }

        //数据缓存
        [WebMethod(Description = "使用数据缓存")]
        public string CacheTest2()
        {
            if (Context.Cache["CacheTest"] == null)
            {
                string time = DateTime.Now.ToString();
                /*
                  absoluteExpiration:所插入对象将过期并被从缓存中移除的时间。
                  如果使用绝对过期，则slidingExpiration 参数必须为 NoSlidingExpiration。
 
                  slidingExpiration:最后一次访问所插入对象时与该对象过期时之间的时间间隔。
                  如果该值等效于 20 分钟，则对象在最后一次被访问 20分钟之后将过期并被从缓存中移除。
                  如果使用可调过期，则 absoluteExpiration 参数必须为NoAbsoluteExpiration。
                  
                 * 如果要使用可变过期，绝对过期必须是 DataTime.MaxValue，不使用可变过期则将其设为TimeSpan.Zero
                */

                //                    (key ,object ,依赖项 , 绝对过期时间, 可变过期时间) (两种过期方式只能使用一种)
                //Context.Cache.Insert("CacheTest", time, null, DateTime.Now.AddSeconds(10),TimeSpan.Zero); //10秒后就重新缓存
                Context.Cache.Insert("CacheTest", time, null, DateTime.MaxValue, TimeSpan.FromSeconds(2));  //2秒不访问后就重新缓存
            }
            
            return Context.Cache["CacheTest"].ToString();
        }



    }
}
